
package com.dingwen.treasure.base.pojo.vo;


import cn.hutool.http.HttpStatus;
import com.dingwen.treasure.base.util.PageUtil;
import com.github.pagehelper.PageInfo;
import org.springframework.util.ObjectUtils;

import java.util.List;


/**
 * 统一返回结果生成
 *
 * @author dingwen
 * @date 2021/06/29
 * @since 1.0.0-SNAPSHOT
 */
public final class ResultGenerator {

    /**
     * 生成结果
     * 1.成功
     * 2.没有数据
     *
     * @return {@link Result}
     */
    public static <T> Result<T> genSuccessResult() {
        return (Result<T>) Result.builder().build();
    }

    /**
     * 生成结果: 仅仅返回消息
     * 1. 成功
     * 2. 消息
     *
     * @param message 消息
     * @return {@link Result}
     */
    public static <T> Result<T> genSuccessResultOnlyMessage(String message) {
        return (Result<T>) Result.builder().message(message).build();
    }


    /**
     * 生成结果
     * 1.成功
     * 2.数据
     * 3.数据为空显示查询结果为空提示
     *
     * @return {@link Result}
     */
    public static <T> Result<T> genSuccessResult(T data) {
        return (Result<T>) Result.builder()
                .data(data)
                .code(ObjectUtils.isEmpty(data) ? HttpStatus.HTTP_NO_CONTENT : HttpStatus.HTTP_OK)
                .message(ObjectUtils.isEmpty(data) ?
                        String.valueOf(HttpStatus.HTTP_NO_CONTENT) : String.valueOf(HttpStatus.HTTP_OK))
                .build();
    }

    /**
     * 生成结果
     * 1.成功
     * 2.数据
     * 3.消息
     *
     * @return {@link Result}
     */
    public static <T> Result<T> genSuccessResult(T data, String message) {
        return (Result<T>) Result.builder()
                .data(data)
                .code(ObjectUtils.isEmpty(data) ? HttpStatus.HTTP_NO_CONTENT : HttpStatus.HTTP_OK)
                .message(message)
                .build();
    }

    /**
     * 生成失败的结果
     * 1. 消息
     *
     * @param message 消息
     * @return {@link Result}
     */
    public static <T> Result<T> genFailureResult(String message) {
        return (Result<T>) Result.builder().message(message).code(HttpStatus.HTTP_INTERNAL_ERROR).build();
    }


    /**
     * 生成失败的结果
     *
     * @return {@link Result}
     */
    public static <T> Result<T> genFailureResult() {
        return (Result<T>) Result.builder()
                .code(HttpStatus.HTTP_INTERNAL_ERROR)
                .build();
    }

    /**
     * 生成失败的结果
     * 1. 消息
     * 2. 状态码
     *
     * @param message    消息
     * @param httpStatus 结果代码
     * @return {@link Result}
     */
    public static <T> Result<T> genFailureResult(String message, Integer httpStatus) {
        return (Result<T>) Result.builder().message(message).code(httpStatus).build();
    }

    /**
     * 生成失败的结果
     * 1. 消息
     * 2. 数据
     *
     * @param message 消息
     * @param t       数据
     * @return {@link Result}
     */
    public static <T> Result<T> genFailureResult(String message, T t) {
        return (Result<T>) Result.builder().message(message).data(t).build();
    }

    /**
     * 生成失败的结果
     * 1. 消息
     * 2. 状态码
     * 3. 详细错误信息
     *
     * @param message    消息
     * @param httpStatus 结果代码
     * @return {@link Result}
     */
    public static <T> Result<T> genFailureResult(String message, Integer httpStatus, T t) {
        return (Result<T>) Result.builder().message(message).code(httpStatus).data(t).build();
    }

    /**
     * 通过布尔运算生成结果
     *
     * @param resultFlag 结果标志
     * @return {@link Result}
     */
    public static <T> Result<T> genResult(boolean resultFlag) {
        return resultFlag ? ResultGenerator.genSuccessResult() : ResultGenerator.genFailureResult();
    }

    /**
     * 通过受影响行数运算生成结果
     *
     * @param row 受影响行数
     * @return {@link Result}
     */
    public static <T> Result<T> genResult(Integer row) {
        return row > 0 ? ResultGenerator.genSuccessResult() : ResultGenerator.genFailureResult();
    }

    /**
     * 生成分页数据返回
     *
     * @param rows 行
     * @return {@link Result}<{@link PageVo}<{@link T}>>
     */
    public static <T> Result<PageVo<T>> genPageResult(List<T> rows) {
        PageVo<T> pageVo = PageVo.<T>builder()
                .pageNum(PageUtil.getPageNum())
                .pageSize(PageUtil.getPageSize())
                .totalNum(new PageInfo(rows).getTotal())
                .rows(rows)
                .build();
        return ResultGenerator.genSuccessResult(pageVo);
    }

}